package com.kakarote.core.utils;

import cn.hutool.core.util.ObjectUtil;
import cn.hutool.core.util.StrUtil;

import java.util.Collection;
import java.util.HashSet;
import java.util.Set;
import java.util.stream.Collectors;

import static com.kakarote.core.common.Const.SEPARATOR;

/**
 * 字符串分割
 */
public class SeparatorUtil {


    /**
     * 字符串转set
     *
     * @param tagStr 字符串
     * @return set
     */
    public static Set<Long> toLongSet(String tagStr) {
        Set<Long> tag = new HashSet<>();
        if (StrUtil.isEmpty(tagStr)) {
            return tag;
        }
        for (String str : tagStr.split(SEPARATOR)) {
            if (StrUtil.isEmpty(str) || "null".equals(str)) {
                continue;
            }
            tag.add(Long.valueOf(str));
        }
        return tag;
    }

    /**
     * list转逗号分隔的字符串
     *
     * @param tag list
     * @return 字符串
     */
    public static String fromSet(Collection<Long> tag) {
        return tag.stream().map(String::valueOf).collect(Collectors.joining(SEPARATOR));
    }

    /**
     * 格式化字符串，在前面增加逗号
     *
     * @param tagStr 字符串
     * @return 字符串
     */
    public static String fromString(String tagStr) {
        if (StrUtil.isEmpty(tagStr)) {
            return "";
        }
        StringBuilder sb = new StringBuilder();
        if (!tagStr.startsWith(SEPARATOR)) {
            sb.append(SEPARATOR);
        }
        sb.append(tagStr);
        if (!tagStr.endsWith(SEPARATOR)) {
            sb.append(SEPARATOR);
        }
        return sb.toString();
    }

    /**
     * 判断两个set是否一致
     *
     * @param set1 set1
     * @param set2 set2
     * @return
     */
    public static boolean isSetEqual(Set<Long> set1, Set<Long> set2) {

        // 两个都为空，或者相等，返回true
        if (ObjectUtil.isAllEmpty(set1, set2)) {
            return true;
        }
        // 一个为空，一个不为空，返回false
        if (ObjectUtil.hasEmpty(set1, set2)) {
            return false;
        }
        if (set1.size() != set2.size()) {
            return false;
        }

        return set1.containsAll(set2);
    }
}
